home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / strlib.zip / BCMP.C < prev    next >
Text File  |  1993-01-04  |  2KB  |  54 lines

  1.  
  2. /*  File   : bcmp.c
  3.     Author : Richard A. O'Keefe.
  4.     Updated: 23 April 1984
  5.     Defines: bcmp()
  6.  
  7.     bcmp(s1, s2, len) returns 0 if the "len" bytes starting at "s1" are
  8.     identical to the "len" bytes starting at "s2", non-zero if they are
  9.     different.   The 4.2bsd manual page doesn't say what non-zero value
  10.     is returned, though the BUGS note says that it takes its parameters
  11.     backwards from strcmp.  This suggests that it is something like
  12.         for (; --len >= 0; s1++, s2++)
  13.             if (*s1 != *s2) return *s2-*s1;
  14.         return 0;
  15.     There, I've told you how to do it.  As the manual page doesn't come
  16.     out and *say* that this is the result, I tried to figure out what a
  17.     useful result might be.   (I'd forgotten than strncmp stops when it
  18.     hits a NUL, which the above does not do.)  What I came up with was:
  19.     the result is the number of bytes in the differing tails.  That is,
  20.     after you've skipped the equal parts, how many characters are left?
  21.     To put it another way, N-bcmp(s1,s2,N) is the number of equal bytes
  22.     (the size of the common prefix).  After deciding on this definition
  23.     I discovered that the CMPC3 instruction does exactly what I wanted.
  24.     The code assumes that N is non-negative.
  25.  
  26.     Note: the "b" routines are there to exploit certain VAX order codes,
  27.     but the CMPC3 instruction will only test 65535 characters.   The asm
  28.     code is presented for your interest and amusement.
  29. */
  30.  
  31. #include "strings.h"
  32.  
  33. #if     VaxAsm
  34.  
  35. int bcmp(s1, s2, len)
  36.     char *s1, *s2;
  37.     int len;
  38.     {
  39.         asm("cmpc3 12(ap),*4(ap),*8(ap)");
  40.     }
  41.  
  42. #else  ~VaxAsm
  43.  
  44. int bcmp(s1, s2, len)
  45.     register char *s1, *s2;
  46.     register int len;
  47.     {
  48.         while (--len >= 0 && *s1++ == *s2++) ;
  49.         return len+1;
  50.     }
  51.  
  52. #endif  VaxAsm
  53.  
  54.